package com.gin.kotlin.no_gay_alliance.webview

import android.util.Log
import androidx.fragment.app.FragmentActivity
import com.gin.kotlin.no_gay_alliance.app.App
import com.gin.kotlin.no_gay_alliance.store.GlobalProperty
import com.gin.nga.utils.BbsCodeRenderer

/**
 * * ReplyContentWebView池
 * 1. 由 ReplyListActivity 持有 池子: ReplyContentWebViewPool
 * 2. ReplyPageFragment 通过 ReplyListActivity 获取到池子并管理自己的小池子
 * 3. onBindViewHolder 方法中 向 ReplyPageFragment 获取指定位置的WebView
 * 4. 如果 ReplyPageFragment 小池子中已有 WebView，直接返回；如果没有，向 ReplyContentWebViewPool 申请一个WebView
 * 5. ReplyContentWebViewPool 检查是否有空闲WebView，有则直接返回，没有则创建一个新的WebView并返回
 * 6. 当 ReplyPageFragment 被销毁时，将其小池子中的 WebView 全部设置为空闲，并从页面中移除
 * 7. onBindViewHolder 方法中获取到WebView之后，将其放入正文layout中并执行渲染
 */
class BbsCodeWebViewPool(private val context: FragmentActivity) {
    private var bbsCodeWebViewClient = BbsCodeWebViewClient(context)
    private val pool: MutableList<BbsCodeWebView> = mutableListOf()
    private val renderer = BbsCodeRenderer(GlobalProperty.getInstance().domain, App.INSTANCE.emoteGroup)
    private val template = context.assets.open("template.html").bufferedReader().readText()

    /**
     * 获取一个空闲的 [BbsCodeWebView] , 如果池子中没有则创建一个新的
     * @return BbsCodeWebView
     */
    fun obtainWebView() = (pool.firstOrNull { !it.busy } ?: instanceWebView()).also {
        it.busy = true
    }

    private fun instanceWebView() = BbsCodeWebView(context).also {
        Log.i(TAG, "从池创建: ReplyContentWebView, 当前容量: ${pool.size + 1}")
        it.webViewClient = bbsCodeWebViewClient
        it.template = template
        it.renderer = renderer
        pool.add(it)
    }

    companion object {
        private val TAG = BbsCodeWebViewPool::class.java.simpleName
    }
}